#!/bin/bash
#
# lib/placement
# Functions to control the configuration and operation of the **Placement** service
#

# Dependencies:
#
# - ``functions`` file
# - ``DEST``, ``DATA_DIR``, ``STACK_USER`` must be defined
# - ``FILES``

# ``stack.sh`` calls the entry points in this order:
#
# - install_placement
# - cleanup_placement
# - configure_placement
# - init_placement
# - start_placement
# - stop_placement

# Save trace setting
_XTRACE_LIB_PLACEMENT=$(set +o | grep xtrace)
set +o xtrace

# Defaults
# --------

PLACEMENT_DIR=$DEST/placement
PLACEMENT_CONF_DIR=/etc/placement
PLACEMENT_CONF=$PLACEMENT_CONF_DIR/placement.conf
PLACEMENT_AUTH_STRATEGY=${PLACEMENT_AUTH_STRATEGY:-keystone}
# Placement virtual environment
if [[ ${USE_VENV} = True ]]; then
    PROJECT_VENV["placement"]=${PLACEMENT_DIR}.venv
    PLACEMENT_BIN_DIR=${PROJECT_VENV["placement"]}/bin
else
    PLACEMENT_BIN_DIR=$(get_python_exec_prefix)
fi
PLACEMENT_UWSGI=placement.wsgi.api:application
PLACEMENT_UWSGI_CONF=$PLACEMENT_CONF_DIR/placement-uwsgi.ini

if is_service_enabled tls-proxy; then
    PLACEMENT_SERVICE_PROTOCOL="https"
fi

# Public facing bits
PLACEMENT_SERVICE_PROTOCOL=${PLACEMENT_SERVICE_PROTOCOL:-$SERVICE_PROTOCOL}
PLACEMENT_SERVICE_HOST=${PLACEMENT_SERVICE_HOST:-$SERVICE_HOST}

# Flag to set the oslo_policy.enforce_scope and oslo_policy.enforce_new_defaults.
# This is used to switch the Placement API policies scope and new defaults.
# By Default, these flag are False.
# For more detail: https://docs.openstack.org/oslo.policy/latest/configuration/index.html#oslo_policy.enforce_scope
PLACEMENT_ENFORCE_SCOPE=$(trueorfalse False PLACEMENT_ENFORCE_SCOPE)

# Functions
# ---------

# Test if any placement services are enabled
# is_placement_enabled
function is_placement_enabled {
    [[ ,${ENABLED_SERVICES} =~ ,"placement-api" ]] && return 0
    return 1
}

# cleanup_placement() - Remove residual data files, anything left over from previous
# runs that a clean run would need to clean up
function cleanup_placement {
    sudo rm -f $(apache_site_config_for placement-api)
    remove_uwsgi_config "$PLACEMENT_UWSGI_CONF" "placement-api"
}

# create_placement_conf() - Write config
function create_placement_conf {
    rm -f $PLACEMENT_CONF
    iniset $PLACEMENT_CONF placement_database connection `database_connection_url placement`
    iniset $PLACEMENT_CONF DEFAULT debug "$ENABLE_DEBUG_LOG_LEVEL"
    iniset $PLACEMENT_CONF api auth_strategy $PLACEMENT_AUTH_STRATEGY
    configure_keystone_authtoken_middleware $PLACEMENT_CONF placement
    setup_logging $PLACEMENT_CONF
}

# configure_placement() - Set config files, create data dirs, etc
function configure_placement {
    sudo install -d -o $STACK_USER $PLACEMENT_CONF_DIR
    create_placement_conf

    write_uwsgi_config "$PLACEMENT_UWSGI_CONF" "$PLACEMENT_UWSGI" "/placement" "" "placement-api"
    if [[ "$PLACEMENT_ENFORCE_SCOPE" == "True" || "$ENFORCE_SCOPE" == "True" ]]; then
        iniset $PLACEMENT_CONF oslo_policy enforce_new_defaults True
        iniset $PLACEMENT_CONF oslo_policy enforce_scope True
    else
        iniset $PLACEMENT_CONF oslo_policy enforce_new_defaults False
        iniset $PLACEMENT_CONF oslo_policy enforce_scope False
    fi
}

# create_placement_accounts() - Set up required placement accounts
# and service and endpoints.
function create_placement_accounts {
    create_service_user "placement" "admin"
    local placement_api_url="$PLACEMENT_SERVICE_PROTOCOL://$PLACEMENT_SERVICE_HOST/placement"
    get_or_create_service "placement" "placement" "Placement Service"
    get_or_create_endpoint \
        "placement" \
        "$REGION_NAME" \
        "$placement_api_url"
}

# init_placement() - Create service user and endpoints
function init_placement {
    recreate_database placement
    $PLACEMENT_BIN_DIR/placement-manage db sync
    create_placement_accounts
}

# install_placement() - Collect source and prepare
function install_placement {
    # Install the openstackclient placement client plugin for CLI
    pip_install_gr osc-placement
    git_clone $PLACEMENT_REPO $PLACEMENT_DIR $PLACEMENT_BRANCH
    setup_develop $PLACEMENT_DIR
}

# start_placement_api() - Start the API processes ahead of other things
function start_placement_api {
    run_process "placement-api" "$(which uwsgi) --procname-prefix placement --ini $PLACEMENT_UWSGI_CONF"

    echo "Waiting for placement-api to start..."
    if ! wait_for_service $SERVICE_TIMEOUT $PLACEMENT_SERVICE_PROTOCOL://$PLACEMENT_SERVICE_HOST/placement; then
        die $LINENO "placement-api did not start"
    fi
}

function start_placement {
    start_placement_api
}

# stop_placement() - Disable the api service and stop it.
function stop_placement {
    stop_process "placement-api"
}

# Restore xtrace
$_XTRACE_LIB_PLACEMENT

# Tell emacs to use shell-script-mode
## Local variables:
## mode: shell-script
## End:
